package com.tianjin.design.mediator;

/**
 * @Description: 中介者模式# 行为型模式
 * 1、解释：用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用，从而使其耦合松散。
 * 2、使用场景：（我的理解）尽量的划分清楚对象，遵循单一职责原则，可以提高代码复用率，但是如果对象之间关联太多，
 *          不遵守迪米特原则，则会导致耦合度倍增，降低了复用率，提高了维护成本，所以为了降低耦合度，遵循迪米特原则，
 *          可以添加一个“中介者”来实现不同对象之间的通讯。
 * 3、代码实现：
 *      3-1 这里使用大公司中人员之间的联系举例，例如前端开发者与UI设计者不认识，但是为了统一工作，此时部门就可以作为中介者来协调两方工作。
 *      3-2 所以需要有两类用户，一类是中介者，一类是工作人员
 *      3-3 我们先抽象一个中介者，中介者需要为工作人员传递消息，所以需要知道消息和发送的对象，定义抽象类 Mediator
 *      3-4 因为部门经理传递消息是肯定是为工作人员传递，且管理人员很多，所以这里可以抽象一个工作人员类 Worker
 *          因为工作人员沟通时需要通过中介者，所以这里需要依赖一个中介者Mediator
 *      3-5 接下来构造一个真正的中介者，研发部部门经理 LeaderMediator， 此经理需要管理几个开发人员，所以需要依赖开发人员
 *          在实际研发部门经理类中维护开发人员 AaaWorker、设计人员 BbbWorker
 *      3-6 接下来就是构造真实的工作人员，
 *          开发人员 AaaWorker
 *          设计人员 BbbWorker
 *      3-7 客户端入main中
 *
 * 4、想法： 使用中介者模式将进行交互的对象分离开了，但是都依赖于中介者，中介者责任太重大，鸡蛋都放到一个篮子里，是不是也不太好？
 *          中介者模式一般用于一组对象以定义良好但是复杂的方式进行通信的场合
 */
public class Test {

    public static void main(String[] args) {

        // 定义中介者
        LeaderMediator mediator = new LeaderMediator();

        // 定义开发人员和设计人员，且他们都是中介者（部门经理）下属
        AaaWorker aaaWorker = new AaaWorker(mediator);
        BbbWorker bbbWorker = new BbbWorker(mediator);

        // 到目前为止，下级人员都认识部门经理，但是经理也得认识下属人员
        mediator.setAaaWorker(aaaWorker);
        mediator.setBbbWorker(bbbWorker);

        // 此时开发需要让设计人员设计ui页面
        aaaWorker.send("我是开发人员，请设计人员帮忙设计页面");
    }

}
